use base_data::channel::{Channel, ChannelCallDirection};
use business::inbound400::manager::run_call_in;
use tokio::sync::mpsc;
use tracing::error;

pub use business::fs_register::user_login_sip_passwd_logic;
pub use business::fs_register::business_reg;

pub(crate) mod business;
pub(crate) mod config;
pub mod db;
pub mod link_to_sip;
///业务逻辑的入口函数.
///
/// 包括呼入和呼出的,只要是一个新的呼叫开始都应该从这个函数开始业务逻辑.
pub fn handle_channel_start(channel: Channel) {
	match channel.direction() {
		ChannelCallDirection::InBound => run_call_in(channel),
		ChannelCallDirection::OutBound => error!("目前还未开始处理呼出的业务逻辑"),
		ChannelCallDirection::UnknownValue => error!("未知的呼叫方向..无法处理")
	}
}

/**
 * 用来进行双工交换的对象。拿到此对象的一个发，从另一个收.
 * 使用这个对象来对一个协程进行收和发的动作。通常，这个对象是有两组的。
 *
 */
#[derive(Debug)]
pub struct DuplexChannel<T, R> {
	pub tx: mpsc::Sender<T>,
	pub rx: mpsc::Receiver<R>,
}

#[derive(Debug, PartialEq, Eq)]
pub enum Navigation {
	Forward,
	BackWard,
}

///呼叫记录类型.
#[derive(Debug)]
pub enum CallingLogType {
	///来电话
	GiveACall,
	///无人接听
	NoAnswer,
	/// 接通
	Bridge,
	///外呼
	CallOout,
}

impl From<CallingLogType> for i32 {
	fn from(value: CallingLogType) -> Self {
		value as u8 as i32
	}
}
